package main

import "fmt"

func main() {
	// 1. 声明数组
	var a1 [5]int
	var a2 [10]int

	// 数组的长度是数组类型的一部分 [5]int和[10]int是两种不同的类型
	fmt.Printf("a1: %T\n", a1) // a1: [5]int
	fmt.Printf("a2: %T\n", a2) // a2: [10]int

	// 2. 数组初始化
	var a3 = [3]int{1, 3, 5}
	fmt.Printf("a3: %v\n", a3)
	// 根据初始化值自动推算容量
	a4 := [...]int{1, 2, 3, 4, 5, 6, 8, 9, 10}
	fmt.Println(len(a4))
	// 根据索引初始化
	a5 := [5]string{0: "a", 3: "c"}
	fmt.Printf("a5: %v\n", a5)

	// 3. 数组初始化
	citys := [...]string{"北京", "上海", "广州", "深圳"}
	for i := 0; i < len(citys); i++ {
		fmt.Println("city:", citys[i])
	}
	for _, v := range citys {
		fmt.Println("city:", v)
	}

	// 4. 多维数组
	var al1 = [3][2]string{{"a", "b"}, {"A", "B"}, {"a1", "b2"}}
	var al2 = [3][2]int{{1, 3}, {5, 7}, {6, 8}}
	fmt.Printf("al1: %v\n", al1) // al1: [[a b] [A B] [a1 b2]]
	fmt.Printf("al2: %v\n", al2) // al2: [[1 3] [5 7] [6 8]]

	// 5. 数组是值类型
	b := [...]int{1, 3, 7}
	b2 := b // 值传递
	b2[0] = 100
	fmt.Println(b, b2) // [1 3 7] [100 3 7]
}
